package com.util;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.springframework.stereotype.Component;


@Component
public class JsonParse {


    /**
     * JSON扁平化函数
     *
     * @param jsonStr
     *            可解释jsonStr字符串
     * @return 扁平化函数Map
     */
    public static Map<String, Object> jsonFlattenAsMap(String jsonStr) {

        Object jsonObj = JSON.parse(jsonStr);

        // 有序HashMap
        Map<String, Object> flatMap = new LinkedHashMap<String, Object>();

        reduce(flatMap, "", jsonObj);

        return flatMap;
    }

    /**
     * 递归调用
     * @param flatMap 结果集
     * @param key 当前键
     * @param jsonObj 递归对象
     *
     */
    private static void reduce(Map<String, Object> flatMap, String key, Object jsonObj) {

        // 如果是对象，对JSON对象进行解释
        if (jsonObj instanceof JSONObject) {
            JSONObject parseJsonObj = (JSONObject) jsonObj;
            if (parseJsonObj.isEmpty()) {
                // 如果是空对象，返回空对象
                flatMap.put(key, "{}");
            } else {
                for (Entry<String, Object> entry : parseJsonObj.entrySet()) {
                    String entryKey = entry.getKey();
                    Object entryValue = entry.getValue();
                    String concatKey = !"".equals(key) ? key.concat(".").concat(entryKey) : entryKey;
                    if (entryValue instanceof JSONObject) {
                        reduce(flatMap, concatKey, entryValue);
                    } else if (entryValue instanceof JSONArray) {
                        reduce(flatMap, concatKey, entryValue);
                    } else {
                        // 放置所有连接值
                        flatMap.put(concatKey, entryValue);
                    }
                }
            }
        } else if (jsonObj instanceof JSONArray) {

            // 如果是数组JSONArray
            JSONArray parseJsonObj = (JSONArray) jsonObj;
            if (parseJsonObj.isEmpty()) {
                // 如果是数组，返回空集
                flatMap.put(key, "[]");
            } else {
                for (int i = 0; i < parseJsonObj.size(); i++) {
                    if (i > 0) {
                        int k = i - 1;
                        key = key.replace("[" + k + "]", "");
                    }
                    key = key + "[" + i + "]";
                    reduce(flatMap, key, parseJsonObj.get(i));
                }
            }
        }
    }
}
